//
//  class_copy.hpp
//  cpp_learn
//
//  Created by 李贺 on 2021/12/29.
//

#ifndef class_copy_hpp
#define class_copy_hpp

#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

namespace fuck01 {

struct NoCopy {
    NoCopy() = default;
    // 声明为delete,通知编译器,我们不希望第一这些成员
    NoCopy(const NoCopy &co) = delete;
    NoCopy & operator=(const NoCopy &) = delete;
    ~NoCopy() = default;
};

class Boy {
public:
    Boy(string name): name(name){
        
    }
    string name;
    ~Boy() {
        
    }
};

class Student {
public:
    Student(): age(1),name("chenchen"),boy(new Boy("fuck")) {
    }
    
    /**
     这里使用const 修饰参数的原因,是我们只需要拷贝stu的内容,
     不需要改变stu的内容
     */
    Student(const Student &stu):age(1),name("chenchen") {
        this->age = stu.age;
        this->name = stu.name;
        boy = new Boy("niuniu");
        this->boy->name = stu.boy->name;
        cout << "copy init" << endl;
    }
    
    /**
     1:这里使用const 修饰参数的原因,是我们只需要拷贝stu的内容,
     不需要改变stu的内容
    2: 返回引用的原因是,就是返回调用者自己,调用者自己的属性被初始化了而已
    3: 在函数调用过程中,非引用参数会被拷贝初始化, 函数的返回值如果不是引用类型,返回值也会用来拷贝初始化
     */
    Student & operator=(const Student &stu) {
        cout << "operator =" << endl;
        this->age = stu.age;
        this->name = stu.name;
        boy = new Boy("niuniu");
        this->boy->name = stu.boy->name;
        return  *this;
    }
    
    ~Student() {
        delete boy;
        cout << "deinit" << endl;
    }
    
private:
    int age;
    string name;
    // 指针类型的构造函数,必须自定义拷贝构造函数,operator=,析构函数
    Boy *boy;
};


void test_student01();

}

#endif /* class_copy_hpp */
